/*****************************************************************************
*
*  @file     IcuDriver.h
*  @brief    Icu驱动
*            1. 负责实现Icu驱动
*
*  @author   潘学林
*  @email                                        
*  @version  V0.000
*  @date     2022/4/21
*  @license  /
*----------------------------------------------------------------------------*
*  Remark         : Description                                              *
*----------------------------------------------------------------------------*
*  Change History :                                                          *
*  <Date>     | <Version> | <Author>       | <Description>                   *
*----------------------------------------------------------------------------*
*  2022/4/21  | 0.000     | 潘学林         | 创建文件                        *
*----------------------------------------------------------------------------*
*
*****************************************************************************/

#ifndef _ICUDRIVER_H_
#define _ICUDRIVER_H_

/* Includes ------------------------------------------------------------------*/

#include "Std_Types.h" 
#include "gd32f30x.h"
#include "systick.h"

/* Micros/Enumerate/Structures -----------------------------------------------*/

/**
 * @brief 引脚定义
 */
#define ICU_CH_0_Pin GPIO_PIN_6
#define ICU_CH_0_Port GPIOA
#define ICU_CH_1_Pin GPIO_PIN_7
#define ICU_CH_1_Port GPIOA

/* ICU总线频率 */
#define ICU_BASE_FREQ 120000000
/* ICU频率，Hz */
#define ICU_FREQ 100000
/* ICU分频系数 */
#define ICU_PRESCALER (ICU_BASE_FREQ/ICU_FREQ)
/* ICU最大计数值 */
#define ICU_COUNTER_MAX 65535

/* PWM输出超时时间，单位：10ms */
#define PWM_OUTPUT_TIMEOUT_TIME 100

/* 
*	是否开启ICU功能 
* 定义表示开启ICU功能 
* 未定义表示不开启ICU功能 
*/
/* #define IF_ENABLE_ICU_FUNCTION */

/**
 * @brief 周期信息
 */
typedef struct ICU_DRIVER_PERIOD_INFO
{
	BOOL PPState; /* 乒乓状态 */
	uint16 pingCounter; /* 乒状态时的计数值 */
	uint16 pongCounter; /* 乓状态时的计数值 */
	uint16 period; /* 周期 */
}ICU_DRIVER_PERIOD_INFO; 

/**
 * @brief 占空比信息
 */
typedef struct ICU_DRIVER_DUTY_INFO
{
	uint16 riseCounter; /* 上升计数值 */
	uint16 downCounter; /* 下降计数值 */
	uint16 duty; /* 占空比 */
}ICU_DRIVER_DUTY_INFO; 

/**
* @brief PWM输出超时控制信息
 */
typedef struct ICU_DRIVER_OUTPUT_TIMEOUT_INFO
{
	uint16 periodCount; /* 周期超时计数 */
	uint16 dutyCount; /* 占空比超时计数 */
}ICU_DRIVER_OUTPUT_TIMEOUT_INFO; 

/**
 * @brief ICU控制信息
 */
typedef struct ICU_DRIVER_CTRL_INFO
{
	ICU_DRIVER_PERIOD_INFO periodInfo; /* 周期信息 */
	ICU_DRIVER_DUTY_INFO dutyInfo; /* 占空比信息 */
	ICU_DRIVER_OUTPUT_TIMEOUT_INFO outputTimeout; /* PWM输出超时信息 */
}ICU_DRIVER_CTRL_INFO; 

/* Variables -----------------------------------------------------------------*/

/* Functions -----------------------------------------------------------------*/

/*****************************************
* 接口函数
*****************************************/
/**
  * @brief  Icu初始化
  * @param  None
  * @retval None
  */
void IcuDriver_Init(void);

/**
  * @brief  轮询任务
  * @param  None
  * @retval None
  */
void IcuDriver_PollTask(void);

/**
  * @brief  周期超时计数自减-10ms周期执行
  * @param  None
  * @retval None
  */
void IcuDriver_PeriodTimeoutSelf(void);

/**
  * @brief  周期超时计数自减-10ms周期执行
  * @param  None
  * @retval None
  */
void IcuDriver_DutyTimeoutSelf(void);

/**
* @brief  获取PWM周期，周期=1/ICU_FREQ*IcuDriver_GetPeriod()
	* @param  None
	* @retval None
  */
uint16 IcuDriver_GetPeriod(void);

/**
* @brief  获取PWM占空比，占空比=1/ICU_FREQ*IcuDriver_GetDuty()
	*				此数据为高电平计数值，实际占空比=IcuDriver_GetDuty()/IcuDriver_GetPeriod()
	* @param  None
	* @retval None
  */
uint16 IcuDriver_GetDuty(void);

#endif

/********************************* END OF FILE ********************************/

